Засоби системного програмування
ЛАБОРАТОРНА РОБОТА № 7.
Багатомодульне програмування.
Мета: Оволодіти навиками створення багатомодульних програм. Засвоїти правила взаємодії різних модулів.
Багатомодульне програмування
При роботі на мові Асемблер під багатомодульним програмуванням розуміють процес написання кількох процедур, підпрограм, у різних вихідних файлах з подальшим їх об’єднанням на етапі лінкування. Таке доцільно робити, коли:
є необхідність компонування декількох програм написаних на різних мовах програмування (наприклад, для об’єднання потужності мов високого рівня та ефективності асемблера);
програма, написана у вигляді одного модуля, може виявитись завеликою для асемблювання;
окремі модулі можуть бути написані різними проектувальниками з метою подальшої інтеграції;
з причини великого розміру
Директива EXTRN має такий формат:
EXTRN ім’я : тип [, … ]
Можна призначити більше одного імені (до кінця рядка) або закодувати додаткові директиви EXTRN. В іншому асемблерному модулі відповідне ім’я повинно бути визначене і ідентифіковане як PUBLIC. Існують такі типи елементів: ABS, BYTE, WORD, DWORD, FAR, NEAR. Ім’я може бути визначене через EQU і повинно задовольняти реальному визначенню імені.
Директива PUBLIC вказує асемблеру і компонувальнику, що адреса вказаного ідентифікатора є доступною з інших програм. Директива має такий формат:
PUBLIC ідентифікатор [, … ]
Можна призначити більше одного ідентифікатора (до кінця рядка) або закодувати додаткові директиви PUBLIC. Ідентифікатори можуть бути мітками (включаючи PROC-мітки), змінними або числами. Неправильними ідентифікаторами є імена регістрів та EQU-ідентифікатори, що призначають більш як двобайтні значення.
Існує декілька способів компонування програм. Кожен з них характеризується одною або декількома такими рисами:
директиви EXTRN і PUBLIC в якості міток;
спільний кодовий сегмент - шляхом використання директиви PUBLIC в заголовку кодового сегменту кожної з програм, що компонуються;
спільні дані.
Використання директив EXTRN і PUBLIC в якості міток
Програма, приведена нижче, складається з основної програми MAINPROG та підпрограми SUBMUL. Директива EXTRN в основній програмі визначає SUBMUL як точку входу в підпрограму. Підпрограма містить директиву PUBLIC, яка вказує компонувальнику на те, що точкою входу для виконання є мітка SUBMUL. Підпрограма перемножує вміст регістру AX (значення з поля даних PRICE) на вміст регістру BX (значення з поля даних QTY), при цьому результат операції буде розміщено в регістровій парі DX:AX (в даному випадку – 002E 4000). В підпрограмі відсутній сегмент даних, оскільки вона не визначає ніяких даних.
*Примітка: Для успішного компонування компонувальник потребує знайти хоча б один стековий сегмент. В підпрограмі не визначено стекового сегменту, оскільки вона використовує ті ж самі стекові адреси, що й основна програма. Таким чином, стек, що визначається в основній програмі, є доступним і в підпрограмі.
TITLE CALLMULL ;Головна програма
EXTRN SUBMUL:FAR
STACKSG SEGMENT PARA STACK 'Stack'
DW 64 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA 'Data'
QTY DW 0140H
PRICE DW 2500H
DATASG ENDS
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV AX,PRICE ;Занести вартість
MOV BX,QTY ; і кількість
CALL SUBMUL ;Викликати підпрограму
RET
BEGIN ENDP
CODESG ENDS
END BEGIN
ТITLE SUBMUL ;Підпрограма множення
CODESG SEGMENT PARA 'Code'
SUBMUL PROC FAR
ASSUME CS:CODESG
PUBLIC SUBMUL
MUL BX ;AX-вартість, BX-кількість
RET ;Добуток в DX:AX
SUBMUL ENDP
CODESG ENDS
END
Використання спільного кодового сегменту
В основній програмі та в усіх підпрограмах, що компонуються разом, необхідно використати атрибут PUBLIC в директиві SEGMENT:
CODESG SEGMENT PARA PUBLIC 'CODE'
В даному випадку з таблиці ідентифікаторів слідує, що узагальнен...